{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据降维"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X = np.empty((100,2))\n",
    "X[:, 0] = np.random.uniform(0., 100, size = 100)\n",
    "X[:, 1] = 0.75 * X[:, 0] + 3. + np.random.normal(0., 10, size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from PCA import PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(n_components = 2)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=2)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.77119516,  0.6365988 ],\n",
       "       [-0.63659869,  0.77119525]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pca = PCA(n_components=1)\n",
    "pca.fit(X)\n",
    "X_reduction = pca.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_reduction.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_restore = pca.inverse_transform(X_reduction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 2)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_restore.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nTxrGAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ed7cf28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:, 0], X[:, 1], color='r')\n",
    "plt.scatter(X_restore[:, 0], X_restore[:, 1], color='b')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## sklearn中的PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pca = PCA(n_components=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=1, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.76178373, -0.64783143]])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_reduction = pca.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_reduction.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_restore = pca.inverse_transform(X_reduction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 2)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_restore.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a19d99da0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:, 0], X[:, 1], color='r', alpha=0.5)\n",
    "plt.scatter(X_restore[:, 0], X_restore[:, 1], color='b', alpha=0.2)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
